﻿class BaseAjax {
    url = "";
    ajaxRequest = null;

    /**
     * 构造方法
     *
        1. 创建一个新变量 request 并赋值 false。使用 false 作为判断条件，它表示还没有创建XMLHttpRequest 对象。
        2. 增加 try/catch 块：
        1. 尝试创建 XMLHttpRequest 对象。
        2. 如果失败（catch (trymicrosoft)）：
        1. 尝试使用较新版本的 Microsoft 浏览器创建 Microsoft 兼容的对象（Msxml2.XMLHTTP）。
        2. 如果失败（catch (othermicrosoft)）尝试使用较老版本的 Microsoft 浏览器创建Microsoft 兼容的对象（Microsoft.XMLHTTP）。
        3. 如果失败（catch (failed)）则保证 request 的值仍然为 false。
        3. 检查 request 是否仍然为 false（如果一切顺利就不会是 false）。
        4. 如果出现问题（request 是 false）则使用 JavaScript 警告通知用户出现了问题。
     * */
    constructor(url, successCallBack, failCallback) {
        this.url = url;
        this.delegate = successCallBack;
        this.ajaxRequest = this.getAjaxRequest(successCallBack, failCallback);
    }


    getAjaxRequest(successCallBack, failCallback) {
        let ajaxRequest;  // The variable that makes Ajax possible!
        try {
            // Opera 8.0+, Firefox, Safari
            ajaxRequest = new XMLHttpRequest();
        } catch (e) {

            // Internet Explorer Browsers
            try {
                ajaxRequest = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (e) {

                try {
                    ajaxRequest = new ActiveXObject("Microsoft.XMLHTTP");
                } catch (e) {
                    // Something went wrong
                    alert("Your browser broke!");
                    return false;
                }
            }
        }

        // Create a function that will receive data
        // sent from the server and will update
        // div section in the same page.
        ajaxRequest.onreadystatechange = () => {
            if (this.ajaxRequest.readyState == 4 && this.ajaxRequest.status == 200) {
                successCallBack();
            } else {
                failCallback();
            }
        };
        return ajaxRequest;
    }
}

class AjaxHelper extends BaseAjax {
    constructor(url, successCallBack, failCallback) {
        super(url, successCallBack, failCallback);
    }

    getResponse() {
        this.ajaxRequest.open("GET", this.url, true);
        this.ajaxRequest.send();
    }

    postResponse() {
        this.ajaxRequest.open("POST", this.url, true);
        this.ajaxRequest.send();
    }
}